#include "personaje.h"


Personaje::Personaje(const std::string &filename,unsigned nCols,unsigned nRows,float gravedad,float velSalto,float nivelTecho,float nivelSuelo):AnimatedSprite(filename,nCols,nRows){
	
	estado=CORRIENDO;
	vida=15;
	
	this->gravedad=gravedad;
	velocidadSalto=velSalto;
	this->nivelTecho=nivelTecho;
	this->nivelSuelo= nivelSuelo - GetImage()->GetHeight()/2 + 30 ;

	SetPosition(GetPosition().x,this->nivelSuelo);

	cayendo=false;
	vuelta=true;
	CargarFrames();

	CambiarAnimacion();

}



void Personaje::CargarFrames(){
	
	frames[CORRIENDO].push_back(0);
	frames[CORRIENDO].push_back(1);
	frames[CORRIENDO].push_back(2);

	frames[SALTANDO].push_back(3);
	frames[SALTANDO].push_back(4);
	frames[SALTANDO].push_back(5);

}


void Personaje::CambiarEstado(Estado e){

	estado=e;
	CambiarAnimacion();	

}


void Personaje::CambiarAnimacion(){

	bool loop=false;
	float vel=0.8;
	if(estado==CORRIENDO)
	{	
		loop=true;
		vel=0.5;
	}
	SetAnimation(frames[estado],vel,loop);

}

void Personaje::Actualizar(const float &dt){

	Animate(dt);
	
	if(estado==SALTANDO)
		ActualizarSalto();

}

void Personaje::Saltar(){

	if(estado!=SALTANDO)	
	{
		CambiarEstado(SALTANDO);
	}
}


void Personaje::ActualizarSalto(){

	sf::Vector2f pos=GetPosition();


	if(!cayendo)
	{	
		
		//Sigue subiendo hasta que alcanza la altura máxima
		SetPosition(pos.x,pos.y-velocidadSalto);
		if(GetPosition().y <=nivelTecho)
        	{	//Comienza a caer
              			cayendo=true;
		}
	}
	else
	{	//Comprueba si ya está en el nivel del suelo, deja de Saltar 
		if(pos.y+gravedad>nivelSuelo)
		{	
			SetPosition(pos.x,nivelSuelo);
			CambiarEstado(CORRIENDO);
			cayendo=false;
		}
		else
		{
			SetPosition(pos.x,pos.y+gravedad);
		}
	}
}



void Personaje::SetPos(float x){
	SetPosition(x,GetPosition().y);

}

void Personaje::SetPosB(float x){

	if(vuelta)
	{
		SetPosition(x,250);
	}	
	else
	{	
		SetPosition(x,300);
	}
	
}


void Personaje::RestarVida(){
	vida--;
}


int Personaje::GetVida(){
	return vida;
}
